home *** CD-ROM | disk | FTP | other *** search
- /*** list.c - linked list procedures ***/
-
- #include <stdio.h>
- #include <strings.h>
- #include <math.h>
- #include "contour.h"
-
- /* initialize the list */
- initialize_list()
- {
- extern triaptr tria_listhead, tria_listtail;
- extern segmptr segm_listhead, segm_listtail;
- extern plotptr plot_listhead, plot_listtail;
-
- tria_listhead = NULL;
- tria_listtail = NULL;
- segm_listhead = NULL;
- segm_listtail = NULL;
- plot_listhead = NULL;
- plot_listtail = NULL;
- }
-
- /* triangles are used to store surface information */
- triaptr make_tria(p1,p2,p3)
- data *p1,*p2,*p3;
- {
- char *malloc();
- triaptr newptr;
-
- if ((newptr = (triaptr)malloc(sizeof(tria)))!=NULL) {
- newptr->pt1 = *p1;
- newptr->pt2 = *p2;
- newptr->pt3 = *p3;
- newptr->next = NULL;
- newptr->prev = NULL;
- }
- return(newptr);
- }
-
- /* Insert a tria at the tail of the current triangle list */
- triaptr insert_tria(p1,p2,p3)
- data *p1,*p2,*p3;
- {
- extern triaptr tria_listhead, tria_listtail;
- triaptr prev,next,A,B;
- triaptr make_tria();
-
- A = tria_listtail;
- if ((B=make_tria(p1,p2,p3))!=NULL) {
- if (A==NULL) {
- tria_listhead = B;
- tria_listtail = B;
- } else {
- prev = A->prev;
- next = A->next;
- B->next = next;
- B->prev = A;
- A->next = B;
- if (next != NULL) next->prev = B;
- if (B->next == NULL) tria_listtail = B;
- }
- }
- return(B);
- }
-
- void print_tria_list()
- {
- void print_point();
- extern triaptr tria_listhead, tria_listtail;
- triaptr T;
-
- for (T=tria_listhead; T!=NULL; T=T->next) {
- print_point(&(T->pt1));
- print_point(&(T->pt2));
- print_point(&(T->pt3));
- fprintf(stdout,"\n");
- }
- }
-
- void print_point(pt)
- data *pt;
- {
- fprintf(stdout,"x= %10.5f y= %10.5f z= %10.5f\n",pt->x,pt->y,pt->z);
- }
-
- /* segments are used to store all the contours */
- segmptr make_segm(p1,p2)
- data *p1,*p2;
- {
- char *malloc();
- segmptr newptr;
-
- if ((newptr = (segmptr)malloc(sizeof(segm)))!=NULL) {
- newptr->pt1 = *p1;
- newptr->pt2 = *p2;
- newptr->next = NULL;
- newptr->prev = NULL;
- }
- return(newptr);
- }
-
- /* Insert a segm at the tail of the current segment list */
- segmptr insert_segm(p1,p2)
- data *p1,*p2;
- {
- extern segmptr segm_listhead, segm_listtail;
- segmptr prev,next,A,B;
- segmptr make_segm();
-
- A = segm_listtail;
- if ((B=make_segm(p1,p2))!=NULL) {
- if (A==NULL) {
- segm_listhead = B;
- segm_listtail = B;
- } else {
- prev = A->prev;
- next = A->next;
- B->next = next;
- B->prev = A;
- A->next = B;
- if (next != NULL) next->prev = B;
- if (B->next == NULL) segm_listtail = B;
- }
- }
- return(B);
- }
-
- /* Delete segm at address L */
- void delete_segm(L)
- segmptr L;
- {
- extern segmptr segm_listhead, segm_listtail;
- segmptr prev,next;
-
- prev = L->prev;
- next = L->next;
- if (prev!=NULL) prev->next = next;
- if (next!=NULL) next->prev = prev;
- if (L==segm_listhead) segm_listhead = next;
- if (L==segm_listtail) segm_listtail = prev;
- free ((char*)L);
- L = NULL;
- }
-
- void print_segm_list()
- {
- void print_point();
- extern segmptr segm_listhead, segm_listtail;
- segmptr S;
-
- for (S=segm_listhead; S!=NULL; S=S->next) {
- print_point(&(S->pt1));
- print_point(&(S->pt2));
- fprintf(stdout,"\n");
- }
- }
-
- /* nodes are used to store all the points of the separate contours */
- nodeptr make_node(p1)
- data *p1;
- {
- char *malloc();
- nodeptr newptr;
-
- if ((newptr = (nodeptr)malloc(sizeof(node)))!=NULL) {
- newptr->pt = *p1;
- newptr->next = NULL;
- newptr->prev = NULL;
- }
- return(newptr);
- }
-
- /* Insert a node at the tail of the current plot-node list */
- nodeptr insert_tailnode(p1,L)
- data *p1;
- plotptr L;
- {
- nodeptr prev,next,A,B;
- nodeptr make_node();
-
- A = L->nodetail;
- if ((B=make_node(p1))!=NULL) {
- if (A==NULL) {
- L->nodehead = B;
- L->nodetail = B;
- } else {
- prev = A->prev;
- next = A->next;
- B->next = next;
- B->prev = A;
- A->next = B;
- if (next != NULL) next->prev = B;
- if (B->next == NULL) L->nodetail = B;
- }
- }
- return(B);
- }
-
- /* Insert a node at the head of the current plot-node list */
- nodeptr insert_headnode(p1,L)
- data *p1;
- plotptr L;
- {
- nodeptr prev,next,A,B;
- nodeptr make_node();
-
- A = L->nodehead;
- if ((B=make_node(p1))!=NULL) {
- if (A==NULL) {
- L->nodehead = B;
- L->nodetail = B;
- } else {
- B->next = A;
- A->prev = B;
- L->nodehead = B;
- }
- }
- return(B);
- }
-
- /* Delete node on plot L at address A */
- void delete_node(A,L)
- nodeptr A;
- plotptr L;
- {
- nodeptr prev,next;
-
- prev = A->prev;
- next = A->next;
- if (prev!=NULL) prev->next = next;
- if (next!=NULL) next->prev = prev;
- if (A==L->nodehead) L->nodehead = next;
- if (A==L->nodetail) L->nodetail = prev;
- free ((char*)A);
- A = NULL;
- }
-
- void print_node_list(L)
- plotptr L;
- {
- void print_point();
- nodeptr N;
-
- for (N=L->nodehead; N!=NULL; N=N->next)
- print_point(&(N->pt));
- fprintf(stdout,"\n");
- }
-
- /* plots are used to store the nodes of each separate contour */
- plotptr make_plot(lvl)
- double lvl;
- {
- char *malloc();
- plotptr newptr;
-
- if ((newptr = (plotptr)malloc(sizeof(plot)))!=NULL) {
- newptr->level = lvl;
- newptr->nodehead = NULL;
- newptr->nodetail = NULL;
- newptr->next = NULL;
- newptr->prev = NULL;
- }
- return(newptr);
- }
-
- /* Insert a plot at the tail of the current plot list */
- plotptr insert_plot(lvl)
- double lvl;
- {
- extern plotptr plot_listhead, plot_listtail;
- plotptr prev,next,A,B;
- plotptr make_plot();
-
- A = plot_listtail;
- if ((B=make_plot(lvl))!=NULL) {
- if (A==NULL) {
- plot_listhead = B;
- plot_listtail = B;
- } else {
- prev = A->prev;
- next = A->next;
- B->next = next;
- B->prev = A;
- A->next = B;
- if (next != NULL) next->prev = B;
- if (B->next == NULL) plot_listtail = B;
- }
- }
- return(B);
- }
-
- /* print the plots */
- void print_plot_list()
- {
- void print_node_list();
- extern plotptr plot_listhead;
- plotptr L;
-
- for (L=plot_listhead; L!=NULL; L=L->next) {
- fprintf(stdout,"Level = %10.5f\n",L->level);
- print_node_list(L);
- }
- }
-